package problem.year2021.march;

import java.util.Objects;

/**
 * 给你一个链表的头节点 head ，旋转链表，将链表每个节点向右移动 k 个位置。
 *  
 * 示例 1：
 * 输入：head = [1,2,3,4,5], k = 2
 * 输出：[4,5,1,2,3]
 * 示例 2：
 * 输入：head = [0,1,2], k = 4
 * 输出：[2,0,1]
 *  
 * 提示：
 * 链表中节点的数目在范围 [0, 500] 内
 * -100 <= Node.val <= 100
 * 0 <= k <= 2 * 109
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/rotate-list
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class March27 {
    public ListNode rotateRight(ListNode head, int k) {
        ListNode start = head;
        int len = 0;
        while (Objects.nonNull(start.next)){
            ++len;
            start = start.next;
        }
        start.next = head;
        start = head;
        // 根据这个特性，可以看出，移动 k 步后，尾节点为 len - k， 头节点为 len - k + 1
        k %= len;
        for (int i = 1; i < len - k; ++i) {
            start = start.next;
        }
        // 现在start是尾节点
        head = start.next;
        start.next = null;
        return head;
    }
}
